﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace exercice5
    {
    class Program
        {
        static void Main(string[] args)
            {
            List<Vehicule> parcVehicules = creerParc();
            while (true)
                {
                System.Console.WriteLine("Agence de location de la Côte d'Azur CostalocEZ\n");
                Int16 choix = choisirVehicule(parcVehicules);
                Vehicule vehiculeLoue = parcVehicules[choix - 1];
                Int32 temps = saisirTemps();
                utiliserVehicule(vehiculeLoue, temps);
                vehiculeLoue.retourner();
                System.Console.WriteLine("\n\nPressez 'q' pour quitter ou n'importe quelle autre touche pour continuer...");
                ConsoleKeyInfo o = System.Console.ReadKey();
                if (o.KeyChar == 'q' || o.KeyChar == 'Q')
                    {
                    System.Environment.Exit(0);
                    }
                }
            }

        private static void afficherBateaux(List<Vehicule> listVehicules)
            {
            System.Console.WriteLine("\n\nPUBLICITE : Affichage de tous les bateaux du parc\n");
            foreach (Vehicule vehicule in listVehicules)
                {
                Bateau bateau;
                if (vehicule is Bateau)
                    {
                    bateau = (Bateau)vehicule;
                    System.Console.WriteLine("----------------------------------------------");
                    bateau.afficher();
                    System.Console.WriteLine("----------------------------------------------\n");
                    }
                }
            }

        private static void utiliserVehicule(Vehicule vehiculeLoue, Int32 temps)
            {
            Random r = new Random();
            vehiculeLoue.louer();
            IEngine vehiculeLoueB = null;
            double distanceParcourue = 0;
            if (!(vehiculeLoue is Vtt))
                {
                vehiculeLoueB = (IEngine)vehiculeLoue;
                if (!vehiculeLoueB.startEngine())
                    {
                    vehiculeLoueB.fillTank();
                    }
                }

            for (Int16 i = 1; i <= temps; ++i)
                {
                Int32 distance = r.Next(1, 600);
                if (!(vehiculeLoue is Vtt))
                    {  
                    distanceParcourue = vehiculeLoueB.drive(distance);
                    if (r.Next(0, 10) == 3)
                        {
                        vehiculeLoueB.showGPSPosition();
                        }
                    }
                
                vehiculeLoue.dormir();
                System.Console.WriteLine("jour " + i + ", " + distance + " km parcouru(s)");
                if (!(vehiculeLoue is Vtt))
                    {
                    System.Console.WriteLine("La distance totale parcourue est de " + distanceParcourue);
                    }
                System.Threading.Thread.Sleep(1000);
                }
            }

        private static int saisirTemps()
            {
            Int32 temps = 0;
            bool isOk = false;
            do
                {
                try
                    {
                    temps = stringToInteger("Combien de jours voulez-vous louer ce véhicule (entre 1 et 20) : ");
                    if (temps > 0 && temps <= 20)
                        {
                        isOk = true;
                        }
                    }
                catch (Exception)
                    {

                    }
                }
            while (!isOk);
            return temps;
            }

        private static Int16 choisirVehicule(List<Vehicule> listVehicules)
            {
            System.Console.WriteLine("Choisissez le véhicule à louer : \n");
            Int16 numero = 1;
            foreach (Vehicule vehicule in listVehicules)
                {
                if (vehicule.isDisponible)
                    {
                    System.Console.WriteLine("n°" + numero);
                    vehicule.afficher();
                    System.Console.WriteLine("--------------------------------------------\n");
                    ++numero;
                    }
                }

            System.Console.WriteLine("'q' pour quitter\n\n");

            Int16 choix = 0;
            bool isOk = false;
            do
                {
                System.Console.Write("Votre choix : ");
                String strChoix = System.Console.ReadLine();
                try
                    {
                    choix = Convert.ToInt16(strChoix);
                    if (choix >= 1 && choix <= listVehicules.Count)
                        {
                        System.Console.WriteLine("\n************************************");
                        listVehicules[choix - 1].afficher();
                        System.Console.WriteLine("**************************************\n");
                        isOk = true;
                        }
                    }
                catch (Exception)
                    {
                    if (strChoix.Length == 1 && strChoix.ToLower()[0] == 'q')
                        {
                        System.Environment.Exit(0);
                        }
                    }
                }
            while (!isOk);

            return choix;
            }

        private static List<Vehicule> creerParc()
            {
            List<Vehicule> listVehicules = new List<Vehicule>();
            listVehicules.Add(new Voiture("Audi A6", 8.5, 65));
            listVehicules.Add(new Bateau("2900 SE", 45.6, 400));
            listVehicules.Add(new Vtt("Atala"));
            listVehicules.Add(new Bateau("Bavaria 30 Sport", 25, 300));
            listVehicules.Add(new Voiture("VV Polo", 3.9, 45));
            listVehicules.Add(new Vtt("Bianchi"));
            listVehicules.Add(new Bateau("40 Vision", 50, 450));
            listVehicules.Add(new Vtt("SERIOUS Rockville"));
            listVehicules.Add(new Bateau("CSL 27", 32, 330));
            listVehicules.Add(new Voiture("Seat Ibiza", 2.8, 48));
            listVehicules.Add(new Vtt("SERIOUS One"));
            return listVehicules;
            }

        public static Int32 stringToInteger(String str)
            {
            System.Console.Write(str);
            String s = System.Console.ReadLine();
            return Convert.ToInt32(s);
            }
        }
    }
